# coding=utf-8
"""
Author: Mr.夏末
@Function: Excel数据驱动
"""
import os, time, pytest, datetime
from keywords.allkeys import Web, APP, Inter
from common.Excel import Reader, Writer
from common.Logger import logger, path


class DDT:
    """Excel数据驱动类"""

    def __init__(self):
        """待使用变量"""
        # 测试用例集
        self.test_suite = []
        # 测试用例
        self.test_case = []

        # 关键字对象
        self.obj: Web() = None
        self.case_type = 'web'

        # 记录用例的序号
        self.case_idx = 0

        # 记录模块名和test_suite名字
        self.feature_name = ''
        self.feature_idx = 0

        self.story_name = ''
        self.story_idx = 0

        # 写入结果对象
        self.writer = Writer()

    def run_test(self):
        """运行用例"""
        # 跑之前，把pytest的执行文件改为test_web_idx.py
        os.rename(path + 'keywords/ddt/test_%s_%d.py' % (self.case_type, self.case_idx - 1),
                  path + 'keywords/ddt/test_%s_%d.py' % (self.case_type, self.case_idx))
        pytest.main(
            ['-s', path + 'keywords/ddt/test_%s_%d.py' % (self.case_type, self.case_idx), '--alluredir', './result'])

    def run_web_cases(self, case_path=''):
        """读取和运行web自动化用例"""
        self.obj = Web()
        self.case_type = 'web'
        reader = Reader()
        # 打开一个excel
        reader.open_excel(path + 'lib/cases/' + case_path)

        # 写入
        resultpath = 'result-' + case_path
        self.writer.copy_open(path + 'lib/cases/' + case_path, path + 'lib/cases/' + resultpath)

        # 获取所有sheet
        sheets = reader.get_sheets()

        # 记录开始时间
        starttime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 1, starttime)

        try:
            for sheet in sheets:
                # 设置读取的sheet页面
                reader.set_sheet(sheet)
                self.writer.set_sheet(sheet)
                self.writer.row = 0

                # 记录模块名和序号
                self.feature_name = sheet
                self.feature_idx += 1

                # 重置用例组的序号
                self.story_idx = 0

                # 读取当前sheet的所有行
                lines = reader.readline()
                for line in lines[1:]:
                    if len(line[0]) > 0:
                        # 第一个单元格里面不为空，应该属于test_suite
                        if self.test_case:
                            # 添加上一组用例的最后一个用例到test_suite
                            self.test_suite.append(self.test_case)
                            # 执行
                            logger.info(self.test_suite)
                            self.run_test()

                        # 重置test_suite和test_case，准备统计下一组用例集
                        self.test_case = []
                        self.test_suite = []

                        # 用例组序号+1
                        self.case_idx += 1

                        # 记录用例组的名字和序号
                        self.story_name = line[0]
                        self.story_idx += 1

                        self.writer.row += 1

                    elif len(line[1]) > 0:
                        # 第二个单元格里面不为空，应该属于test_case
                        if self.test_case:
                            self.test_suite.append(self.test_case)
                        # 重置test_case，准备统计下一个用例
                        self.test_case = []
                        # 用例也添加进去
                        self.test_case.append(line)
                    else:
                        # 其他都是测试步骤
                        #  如果是步骤，则直接添加到test_case（用例列表）
                        self.test_case.append(line)

                # 一个sheet（模块）统计完成后，把最后一组用例添加到test_suite，并执行。
                if self.test_case:
                    self.test_suite.append(self.test_case)
                    # 执行
                    logger.info(self.test_suite)
                    self.run_test()

                # 重置test_suite和test_case，准备统计下一组用例集
                self.test_case = []
                self.test_suite = []
        except Exception as e:
            logger.error(e)
        finally:
            # 全部用例组执行完成后，把用例文件名字改回test_web_0.py。防止下一次执行找不到文件。
            os.rename(path + 'keywords/ddt/test_%s_%d.py' % (self.case_type, self.case_idx),
                      path + 'keywords/ddt/test_web_0.py')
            # 记录结束时间
            endtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            self.writer.set_sheet(sheets[0])
            self.writer.write(1, 2, endtime)
            self.writer.save_close()

    def run_app_cases(self, case_path=''):
        """读取和运行app自动化用例"""
        self.obj = APP()
        self.case_type = 'app'
        reader = Reader()
        # 打开一个excel
        reader.open_excel(path + 'lib/cases/' + case_path)

        # 写入
        resultpath = 'result-' + case_path
        self.writer.copy_open(path + 'lib/cases/' + case_path, path + 'lib/cases/' + resultpath)

        # 获取所有sheet
        sheets = reader.get_sheets()

        # 记录开始时间
        starttime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 1, starttime)

        try:
            for sheet in sheets:
                # 设置读取的sheet页面
                reader.set_sheet(sheet)
                self.writer.set_sheet(sheet)
                self.writer.row = 0

                # 记录模块名和序号
                self.feature_name = sheet
                self.feature_idx += 1

                # 重置用例组的序号
                self.story_idx = 0

                # 读取当前sheet的所有行
                lines = reader.readline()
                for line in lines[1:]:
                    if len(line[0]) > 0:
                        # 第一个单元格里面不为空，应该属于test_suite
                        if self.test_case:
                            # 添加上一组用例的最后一个用例到test_suite
                            self.test_suite.append(self.test_case)
                            # 执行
                            logger.info(self.test_suite)
                            self.run_test()

                        # 重置test_suite和test_case，准备统计下一组用例集
                        self.test_case = []
                        self.test_suite = []

                        # 用例组序号+1
                        self.case_idx += 1

                        # 记录用例组的名字和序号
                        self.story_name = line[0]
                        self.story_idx += 1

                        self.writer.row += 1

                    elif len(line[1]) > 0:
                        # 第二个单元格里面不为空，应该属于test_case
                        if self.test_case:
                            self.test_suite.append(self.test_case)
                        # 重置test_case，准备统计下一个用例
                        self.test_case = []
                        # 用例也添加进去
                        self.test_case.append(line)
                    else:
                        # 其他都是测试步骤
                        #  如果是步骤，则直接添加到test_case（用例列表）
                        self.test_case.append(line)

                # 一个sheet（模块）统计完成后，把最后一组用例添加到test_suite，并执行。
                if self.test_case:
                    self.test_suite.append(self.test_case)
                    # 执行
                    logger.info(self.test_suite)
                    self.run_test()

                # 重置test_suite和test_case，准备统计下一组用例集
                self.test_case = []
                self.test_suite = []
        except Exception as e:
            logger.error(e)
        finally:
            # 全部用例组执行完成后，把用例文件名字改回test_app_0.py。防止下一次执行找不到文件。
            os.rename(path + 'keywords/ddt/test_%s_%d.py' % (self.case_type, self.case_idx),
                      path + 'keywords/ddt/test_app_0.py')
            # 记录结束时间
            endtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            self.writer.set_sheet(sheets[0])
            self.writer.write(1, 2, endtime)
            self.writer.save_close()

            # 关闭连接
            time.sleep(2)
            self.obj.quit()
            time.sleep(3)
            # 关闭appium服务
            self.obj.closeappium()

    def run_inter_cases(self, case_path=''):
        """读取和运行接口自动化用例"""
        self.obj = Inter()
        self.case_type = 'inter'
        reader = Reader()
        # 打开一个excel
        reader.open_excel(path + 'lib/cases/' + case_path)

        # 写入
        resultpath = 'result-' + case_path
        self.writer.copy_open(path + 'lib/cases/' + case_path, path + 'lib/cases/' + resultpath)

        # 获取所有sheet
        sheets = reader.get_sheets()

        # 记录开始时间
        starttime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        self.writer.set_sheet(sheets[0])
        self.writer.write(1, 1, starttime)

        try:
            for sheet in sheets:
                # 设置读取的sheet页面
                reader.set_sheet(sheet)
                self.writer.set_sheet(sheet)
                self.writer.row = 0

                # 记录模块名和序号
                self.feature_name = sheet
                self.feature_idx += 1

                # 重置用例组的序号
                self.story_idx = 0

                # 读取当前sheet的所有行
                lines = reader.readline()
                for line in lines[1:]:
                    if len(line[0]) > 0:
                        # 第一个单元格里面不为空，应该属于test_suite
                        if self.test_case:
                            # 添加上一组用例的最后一个用例到test_suite
                            self.test_suite.append(self.test_case)
                            # 执行
                            logger.info(self.test_suite)
                            self.run_test()

                        # 重置test_suite和test_case，准备统计下一组用例集
                        self.test_case = []
                        self.test_suite = []

                        # 用例组序号+1
                        self.case_idx += 1

                        # 记录用例组的名字和序号
                        self.story_name = line[0]
                        self.story_idx += 1

                        self.writer.row += 1

                    elif len(line[1]) > 0:
                        # 第二个单元格里面不为空，应该属于test_case
                        if self.test_case:
                            self.test_suite.append(self.test_case)
                        # 重置test_case，准备统计下一个用例
                        self.test_case = []
                        # 用例也添加进去
                        self.test_case.append(line)
                    else:
                        # 其他都是测试步骤
                        #  如果是步骤，则直接添加到test_case（用例列表）
                        self.test_case.append(line)

                # 一个sheet（模块）统计完成后，把最后一组用例添加到test_suite，并执行。
                if self.test_case:
                    self.test_suite.append(self.test_case)
                    # 执行
                    logger.info(self.test_suite)
                    self.run_test()

                # 重置test_suite和test_case，准备统计下一组用例集
                self.test_case = []
                self.test_suite = []
        except Exception as e:
            logger.error(e)
        finally:
            # 全部用例组执行完成后，把用例文件名字改回test_inter_0.py。防止下一次执行找不到文件。
            os.rename(path + 'keywords/ddt/test_%s_%d.py' % (self.case_type, self.case_idx),
                      path + 'keywords/ddt/test_inter_0.py')
            # 记录结束时间
            endtime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
            self.writer.set_sheet(sheets[0])
            self.writer.write(1, 2, endtime)
            self.writer.save_close()


# 创建对象，供全局调用
ddt = DDT()
